#define _CRT_SECURE_NO_WARNINGS

//#include<iostream>
//using namespace std;
//class Student {
//
//private:
//    static int count;
//    static float numtotal;
//    int num;
//    int age;
//    float score;
//
//public:
//    Student() {}
//    Student(int a, int b, float c)
//    {
//        num = a;
//        age = b;
//        score = c;
//    }
//    ~Student(){}
//    void total()
//    {
//        numtotal += score;
//        count++;
//
//    }
//    static float average()
//    {
//        return numtotal/count;
//    }
//
//
//};
//
//int Student::count = 0;
//float Student::numtotal = 0;
//
//int main()
//{
//    int n;
//    cout << "Please input the number of students:";
//    cin >> n;
//    Student* p = new Student[n];
//    for (int i = 0; i < n; i++)
//    {
//        int num, age;
//        float score;
//        cin >> num >> age >> score;
//        p[i] = Student(num, age, score);
//        p[i].total();
//    }
//    cout << "The average score of " << n << " student is " << Student::average() << endl;
//
//    if (p != NULL)    delete[]p;
//    return 0;
//}

//#include<iostream>
//using namespace std;
//class Circle {
//private:
//	double r;
//public:
//	Circle(double r)
//	{
//		this->r = r;
//	}
//	Circle()
//	{
//		r = 0;
//	}
//	double circum()
//	{
//		return 2 * 3.14 * r;
//	}
//	double area()
//	{
//		return 3.14 * r * r;
//	}
//	void show()
//	{
//		cout << "r=" << r << endl;
//	}
//};
//
//int main()
//{
//	double r;
//	cin >> r;
//	Circle c1, c2(r);
//	c1.show();
//	c2.show();
//	cout << c1.circum() << endl;
//	cout << c2.circum() << endl;
//	cout << c1.area() << endl;
//	cout << c2.area() << endl;
//	return 0;
//}

//#include<iostream>
//using namespace std;
//class AA {
//private: 
//	int a, b, c;
//public:
//	AA(int a, int b, int c)
//	{
//		this->a = a;
//		this->b = b;
//		this->c = c;
//	}
//	friend int add(AA aa);
//};
//
//int add(AA aa)
//{
//	return aa.a + aa.b + aa.c;
//}

//#include<iostream>
//#include <string>
//using namespace std;
//void input(string *str, int n)
//{
//	int i = 0;
//	for (; i < n; i++)
//	{
//		cin >> str[i];
//	}
//}
//
//void sort(string* str, int n)
//{
//	int i = 0, j = 0;
//	for (; i < n; i++)
//	{
//		for (j = 0; j < n -i- 1; j++)
//		{
//			if (str[j] > str[j + 1])
//			{
//				string tmp = str[j];
//				str[j] = str[j + 1];
//				str[j + 1] = tmp;
//			}
//		}
//	}
//}
//
//void output(string *str, int n)
//{
//	int i = 0;
//	for (; i < n; i++)
//	{
//		cout << str[i] << endl;
//	}
//}
//int main()
//{
//	string str[5];
//	int n = 5;
//	input(str, n);
//	sort(str, n);
//	cout << "After sorting:" << endl;
//	output(str, n);
//	return 0;
//}


//#include<iostream>
//#include<cmath>
//using namespace std;
//struct compute{
//	double r=0, i=0;
//	void init(double x, double y)
//	{
//		r = x;
//		i = y;
//	}
//	double model()
//	{
//		double m= sqrt((r * r + i * i));
//		return m;
//	}
//	
//};
//int main()
//{
//	struct compute c1;
//	double x1 = 0, x2 = 0;
//	cin >> x1 >> x2;
//	c1.init(x1, x2);
//	cout << c1.model() << endl;
//	return 0;
//}

//#include<iostream>
//#include<cmath>
//using namespace std;
//struct op {
//	int x = 0, y = 0;
//};
//int main()
//{
//	struct op op1; 
//	struct op op2;
//	cin >>op1.x >> op1.y >> op2.x >> op2.y;
//	cout << "op1 i=" << op1.x << " j=" << op1.y << endl;
//	cout << "op2 i=" << op2.x << " j=" << op2.y << endl;
//}


//#include<iostream>
//#include<cmath>
//using namespace std;
//class Complex {
//private:
//	double real;
//	double imag;
//public:
//	Complex()
//	{
//		real = 0;
//		imag = 0;
//	}
//	void init(double r, double i)
//	{
//		this->real = r;
//		this->imag = i;
//	}
//	double abs()
//	{
//		return sqrt(real*real+imag*imag);
//	}
//};
//
//int main()
//{
//	Complex A;
//	double x = 0, y = 0;
//	cin >> x >> y;
//	A.init(x, y);
//	cout << A.abs() << endl;
//	return 0;
//}

//#include<iostream>
//using namespace std;
//class A {
//public:
//	A(int x1) :x(x1), rx(x), pi(3.14)
//	{
//	}
//	void print()
//	{
//		cout << "x=" << x << " " << "rx=" << rx << " " << "pi=" << pi << endl;
//	}
//private:
//	int x;
//	int& rx;
//	const double pi;
//};
//
//int main()
//{
//	A a(10);
//	a.print();
//	return 0;
//}
//
//#include<iostream>
//using namespace std;
//class timer {
//private:
//	int seconds;
//public:
//	timer()
//	{
//		seconds = 0;
//	}
//	timer(char* p)
//	{
//		seconds=atoi(p);
//	}
//	timer(int n)
//	{
//		seconds = n;
//	}
//	timer(int min, int sec)
//	{
//		seconds = min * 60 + sec;
//	}
//	int gettime()
//	{
//		return seconds;
//	}
//};
//
//int main()
//{
//	int x, y;
//	cin >> x >> y;
//	timer a;
//	timer b(10);
//	timer c(20);
//	timer d(x, y);
//	cout << "seconds1=" << a.gettime() << endl;
//	cout << "seconds2=" << b.gettime() << endl;
//	cout << "seconds3=" << c.gettime() << endl;
//	cout << "seconds4=" << d.gettime() << endl;
//	return 0;
//}

//#include <iomanip>
//#include<iostream>
//#include<cmath>
//using namespace std;
//class Complex {
//public:
//	Complex(double r = 0.0, double i = 0.0)
//	{
//		real = r;
//		imag = i;
//	}
//	double abs()
//	{
//		return sqrt(real*real+imag*imag);
//	}
//private:
//	double real;
//	double imag;
//};
//int main()
//{
//	Complex s1;
//
//	double x = 0, y = 0;
//	cin >> x >> y ;
//	Complex s2(x);
//	Complex s3(x, y);
//	cout << s1.abs() << endl;
//	cout.setf(ios::fixed);
//	cout << setprecision(4) << s2.abs() << endl;
//	cout << setprecision(4) << s3.abs() << endl;
//	return 0;
//}
#include <iomanip>
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
class Solution {
public:
    int numDistinct(string s, string t) {
        int n = s.size();
        int m = t.size();
        if (n < m)
            return 0;
        vector<vector<int>> dp(n + 1, vector<int>(m + 1));
        for (int i = 0; i < n + 1; i++)
        {
            dp[i][m] = 1;
        }
        for (int i = n - 1; i >= 0; i--)
        {
            for (int j = m - 1; j >= 0; j--)
            {
                if (s[i] == t[j])
                {
                    dp[i][j] = dp[i + 1][j + 1] + dp[i + 1][j];
                }
                else
                {
                    dp[i][j] = dp[i + 1][j];
                }

            }
        }
        return dp[0][0];
    }
};

int main()
{
    Solution s;
    int ret=s.numDistinct("xslledayhxhadmctrliaxqpokyezcfhzaskeykchkmhpyjipxtsuljkwkovmvelvwxzwieeuqnjozrfwmzsylcwvsthnxujvrkszqwtglewkycikdaiocglwzukwovsghkhyidevhbgffoqkpabthmqihcfxxzdejletqjoxmwftlxfcxgxgvpperwbqvhxgsbbkmphyomtbjzdjhcrcsggleiczpbfjcgtpycpmrjnckslrwduqlccqmgrdhxolfjafmsrfdghnatexyanldrdpxvvgujsztuffoymrfteholgonuaqndinadtumnuhkboyzaqguwqijwxxszngextfcozpetyownmyneehdwqmtpjloztswmzzdzqhuoxrblppqvyvsqhnhryvqsqogpnlqfulurexdtovqpqkfxxnqykgscxaskmksivoazlducanrqxynxlgvwonalpsyddqmaemcrrwvrjmjjnygyebwtqxehrclwsxzylbqexnxjcgspeynlbmetlkacnnbhmaizbadynajpibepbuacggxrqavfnwpcwxbzxfymhjcslghmajrirqzjqxpgtgisfjreqrqabssobbadmtmdknmakdigjqyqcruujlwmfoagrckdwyiglviyyrekjealvvigiesnvuumxgsveadrxlpwetioxibtdjblowblqvzpbrmhupyrdophjxvhgzclidzybajuxllacyhyphssvhcffxonysahvzhzbttyeeyiefhunbokiqrpqfcoxdxvefugapeevdoakxwzykmhbdytjbhigffkmbqmqxsoaiomgmmgwapzdosorcxxhejvgajyzdmzlcntqbapbpofdjtulstuzdrffafedufqwsknumcxbschdybosxkrabyfdejgyozwillcxpcaiehlelczioskqtptzaczobvyojdlyflilvwqgyrqmjaeepydrcchfyftjighntqzoo", "rwmimatmhydhbujebqehjprrwfkoebcxxqfktayaaeheys");
    printf("%d", ret);
    return 0;
}